home *** CD-ROM | disk | FTP | other *** search
- /* (Amiga E source code)
- Diff.e : a utility to compare files, written in Amiga E
- Author : Email: eravau@is2.bfu.vub.ac.be (RAVAU Erwin)
- WWW-Page: http://dinf.vub.ac.be/~eravau
- USAGE : Diff <file1> <file2>
- Needs kick 2.0+
- */
-
- OPT OSVERSION=37
-
- ENUM ER_NONE,ER_FILE1,ER_FILE2,ER_MEM,ER_SYNTAX
-
- DEF myargs:PTR TO LONG,rdargs,flen1,flen2,handle1=NIL,handle2=NIL,
- buf1=NIL,buf2=NIL,result,perc,min,i
-
- PROC main()
- i:='$VER: Diff 1.0 (14.04.94)'
- myargs:=[0,0,0,0]
- WriteF('Diff v1.0 by Erwin Ravau.\n')
- IF rdargs:=ReadArgs('FILE_1/A,FILE_2/A',myargs,NIL)
- ELSE
- error(ER_SYNTAX)
- ENDIF
- load()
- WriteF('Comparing \e[1m\s\e[0m with \e[1m\s\e[0m.\n',myargs[0],myargs[1])
- IF flen1<>flen2
- WriteF('\e[1mFiles not of same length.\e[0m (Resp. \d and \d bytes long)\n',flen1,flen2)
- WriteF('Operating on ')
- IF flen1<flen2
- WriteF('\d',flen1)
- ELSE
- WriteF('\d',flen2)
- ENDIF
- WriteF(' lowest bytes.\n')
- ENDIF
- diff()
- perc:=Mul(result,100) /* 32-bit multiplication */
- perc:=Div(perc,min)
- WriteF('Difference in bytes : \e[1m\d / \d\e[0m\n',result,min)
- WriteF('Difference in percent : \e[1m\d %\e[0m\n',perc)
- error(ER_NONE)
- ENDPROC
-
- PROC load()
- flen1:=FileLength(myargs[0])
- handle1:=Open(myargs[0],OLDFILE)
- IF (flen1<1) OR (handle1=NIL) THEN error(ER_FILE1)
- flen2:=FileLength(myargs[1])
- handle2:=Open(myargs[1],OLDFILE)
- IF (flen2<1) OR (handle2=NIL) THEN error(ER_FILE2)
- MOVE.L flen1,D6 /* get smallest filelength */
- MOVE.L flen2,D7
- CMP.L D6,D7
- BLS noswap
- EXG.L D6,D7 /* exchange filelengths */
- noswap:
- MOVE.L D7,min /* min = smallest length */
- buf1:=New(min)
- IF buf1=NIL THEN error(ER_MEM)
- buf2:=New(min)
- IF buf2=NIL THEN error(ER_MEM)
- IF Read(handle1,buf1,min)<>min THEN error(ER_FILE1)
- Close(handle1)
- handle1:=NIL
- IF Read(handle2,buf2,min)<>min THEN error(ER_FILE2)
- Close(handle2)
- handle2:=NIL
- ENDPROC
-
- PROC diff()
- MOVE.L buf1,A0 /* adress of file1 in memory */
- MOVE.L buf2,A1 /* adress of file2 in memory */
- FOR i:=1 TO min
- MOVE.B (A0)+,D4
- MOVE.B (A1)+,D5
- CMP.B D4,D5
- BEQ equal
- result:=result+1
- equal:
- ENDFOR
- ENDPROC
-
- PROC error(nr)
- IF handle1 THEN Close(handle1)
- IF handle2 THEN Close(handle2)
- SELECT nr
- CASE ER_FILE1; WriteF('Could not read \e[1m\s\e[0m\n',myargs[0])
- CASE ER_FILE2; WriteF('Could not read \e[1m\s\e[0m\n',myargs[1])
- CASE ER_MEM; WriteF('No memory to load files!\n')
- CASE ER_SYNTAX; WriteF('Syntax error\n')
- CASE ER_NONE;
- ENDSELECT
- FreeArgs(rdargs)
- CleanUp(0)
- ENDPROC
-